package com.autumn.chat.core;

import com.alibaba.fastjson.JSONObject;
import com.autumn.chat.config.GlobalParam;
import com.autumn.chat.constant.BLiveOperationConstant;
import com.autumn.chat.constant.BLiveVersionConstant;
import com.autumn.chat.constant.BodyCMDConstant;
import com.autumn.chat.struct.blive.BLiveProto;
import com.autumn.chat.struct.blive.PlatformDmCMD;
import com.autumn.chat.struct.gpt.PushMessage;

/**
 * ClassName: BLiveMessageHandle
 * Description:
 * Author: Shen_Yue
 * Date: 2023/3/4 1:44
 * History:
 * <author>          <time>          <version>          <desc>
 * wangqiuyang    2023/3/4 1:44   @Version 1.0        描述
 */
public class BLiveMessageHandle {

    /**
    * Description: 处理 websocket 返回的消息
    * @param bLiveProto 包
    * @return: void
    * @author: Shen_Yue
    * @Date: 1:52 2023/3/4
    */
    public static void OnMessageHandle(BLiveProto bLiveProto) {
        if (bLiveProto.getVersion() == BLiveVersionConstant.ZIP) {
            // 这里不处理version为2的消息 因为b站开发群的群友说使用官方的api的话 基本上不会出现version为2的情况。
            return;
        }

        if (bLiveProto.getOperation() == BLiveOperationConstant.OP_AUTH_REPLY) {
            // 收到鉴权包的回复 这里不处理只打印
            return;
        }

        if (bLiveProto.getOperation() == BLiveOperationConstant.OP_HEARTBEAT_REPLY) {
            // 收到心跳检测的回复 这里不处理只打印
            return;
        }

        if (bLiveProto.getOperation() == BLiveOperationConstant.OP_SEND_SMS_REPLY) {
            // 收到的弹幕消息推送， 这里要处理
            String body = bLiveProto.getBody();
            smsReplyHandle(body);
        }

        // 如果出了其他值说明包非法了 这里不处理
    }
    
    /**
    * Description: 处理推送的弹幕消息
    * @param body
    * @return: void
    * @author: Shen_Yue
    * @Date: 3:21 2023/3/4
    */
    private static void smsReplyHandle(String body) {

        JSONObject cmdJSON = JSONObject.parseObject(body);

        if (BodyCMDConstant.DM.equals(cmdJSON.get("cmd"))) {
            JSONObject data = cmdJSON.getJSONObject("data");

            // 普通弹幕消息
            dmHandle(data);
        }

        if (BodyCMDConstant.GIFT.equals(cmdJSON.get("cmd"))) {
            JSONObject data = cmdJSON.getJSONObject("data");

            // 礼物弹幕消息
            giftHandle(data);
        }

        if (BodyCMDConstant.SUPER_CHAT.equals(cmdJSON.get("cmd"))) {
            JSONObject data = cmdJSON.getJSONObject("data");

            // 付费弹幕开始
            superChatHandle(data);
        }

        if (BodyCMDConstant.SUPER_CHAT_DEL.equals(cmdJSON.get("cmd"))) {
            JSONObject data = cmdJSON.getJSONObject("data");

            // 付费弹幕结束
            superChatDelHandle(data);
        }

        if (BodyCMDConstant.GUARD.equals(cmdJSON.get("cmd"))) {
            JSONObject data = cmdJSON.getJSONObject("data");

            // 付费大航海弹幕
            guardHandle(data);
        }
    }

    /**
    * Description: 处理弹幕消息
    * @param data
    * @return: void
    * @author: Shen_Yue
    * @Date: 3:24 2023/3/4
    */
    private static void dmHandle(JSONObject data) {
        PlatformDmCMD dm = new PlatformDmCMD();
        dm.setuName(data.getString("uname"));
        dm.setUid(data.getLong("uid"));
        dm.setRoomID(data.getLong("room_id"));
        dm.setMsg(data.getString("msg"));
        dm.setMsgID(data.getString("msg_id"));
        dm.setFansMedalLevel(data.getLong("fans_medal_level"));
        dm.setFansMedalName(data.getString("fans_medal_name"));
        dm.setFansMedalWearingStatus(data.getBooleanValue("fans_medal_wearing_status"));
        dm.setGuardLevel(data.getIntValue("guard_level"));
        dm.setTimeStamp(data.getLongValue("timestamp"));
        dm.setuFace(data.getString("uface"));
        dm.setEmojiImgUrl(data.getString("emoji_img_url"));
        dm.setDmType(data.getLongValue("dm_type"));

        // 此时可以拿着dm 去做其他的业务逻辑

        // 设置推送规则
        String msg = dm.getMsg();
        if (msg.startsWith("gpt-")) {
            // 以'gpt-' 开头的弹幕 加入推送队列
            PushMessage push = new PushMessage();
            push.setContent(msg.replace("gpt-",""));
            push.setUname(dm.getuName());

            try {
                // 将将弹幕作为生产者加入队列 , 队列有专门的定时任务去消费。
                GlobalParam.gptPushQueue.put(push);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }

    /**
    * Description: 处理礼物信息
    * @param data
    * @return: void
    * @author: Shen_Yue
    * @Date: 3:27 2023/3/4
    */
    private static void giftHandle(JSONObject data) {
        // 空方法 根据实际需求添加
    }

    /**
    * Description: 处理付费弹幕信息
    * @param data
    * @return: void
    * @author: Shen_Yue
    * @Date: 3:27 2023/3/4
    */
    private static void superChatHandle(JSONObject data) {
        // 空方法 根据实际需求添加
    }

    /**
    * Description: 处理付费弹幕消失信息
    * @param data
    * @return: void
    * @author: Shen_Yue
    * @Date: 3:27 2023/3/4
    */
    private static void superChatDelHandle(JSONObject data) {
        // 空方法 根据实际需求添加
    }

    /**
     * Description: 处理大航海信息
     * @param data
     * @return: void
     * @author: Shen_Yue
     * @Date: 3:27 2023/3/4
     */
    private static void guardHandle(JSONObject data) {
        // 空方法 根据实际需求添加
    }
}
